#include "mysql_pool.hpp"
#include <mysql/mysql.h>
#include "../logger.hpp"
MySQLPool::MySQLPool(const MySQLConfig& config)
    : ConnectionPool<MYSQL>(config.pool_config)
    , config_(config) {}

// MySQLPool::~MySQLPool() {
//     Logger::info("MySQLPool destroyed");
// }

std::shared_ptr<MYSQL> MySQLPool::create_connection() {
    MYSQL* conn = mysql_init(nullptr);
    if (!conn) {
        Logger::error("{} create mysql connection failed", __func__);
        return nullptr;
    }

    // 设置自动重连
    bool reconnect = 1;
    mysql_options(conn, MYSQL_OPT_RECONNECT, &reconnect);
    
    // 设置连接超时
    int timeout = 3;
    mysql_options(conn, MYSQL_OPT_CONNECT_TIMEOUT, &timeout);

    if (!mysql_real_connect(conn, 
        config_.host.c_str(),
        config_.user.c_str(),
        config_.password.c_str(),
        config_.database.c_str(),
        config_.port,
        nullptr,
        0)) {
        mysql_close(conn);
        return nullptr;
    }

    // 打印日志，创建了mysql连接
    Logger::info("create mysql connection");

    return std::shared_ptr<MYSQL>(conn, [](MYSQL* conn) {
        Logger::info("{} close mysql connection", __func__);
    });
}

bool MySQLPool::validate_connection(MYSQL* conn) {
    if (!conn) return false;
    return mysql_ping(conn) == 0;
}

void MySQLPool::close_connection(MYSQL* conn) {
    if (conn) {
        mysql_close(conn);
    }
}